package acom.imghandle.aa;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;

public class RandomValidateCode {
	public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key
    private Random random = new Random();
    private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串
    
    private int width = 60;//图片宽
    private int height = 80;//图片高
    private int lineSize = 40;//干扰线数量
    private int stringNum = 4;//随机产生字符数量
    
    private int fontSize=0;
    /*
     * 获得字体
     */
    private Font getFont(){
    	//new Font("Times New Roman",Font.PLAIN,18)
    	//new Font("Fixedsys",Font.CENTER_BASELINE,18)
    	//new Font("Times New Roman",Font.ROMAN_BASELINE,18)
        return new Font("宋体",Font.PLAIN,18);
    }
    /*
     * 获得颜色
     */
    private Color getRandColor(int fc,int bc){
        if(fc > 255)
            fc = 255;
        if(bc > 255)
            bc = 255;
        int r = fc + random.nextInt(bc-fc-16);
        int g = fc + random.nextInt(bc-fc-14);
        int b = fc + random.nextInt(bc-fc-18);
        return new Color(r,g,b);
    }
    /**
     * 生成随机图片
     */
    public BufferedImage getRandcode() {
        //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
        Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,26));
        
        //绘制干扰线
       /* for(int i=0;i<=lineSize;i++){
        	g.setColor(getRandColor(110, 133));
            drowLine(g);
        }*/
        //绘制随机字符
        String randomString = "";
        for(int i=1;i<=stringNum;i++){
            randomString+=drowString(g,genetString(),i);
        }
        
        //System.out.println("随机的:"+randomString);
        g.dispose();
        
        return image;
    }
    
    public BufferedImage getStringcode(String setString) {
    	//BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
        Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("楷体",Font.BOLD,getFontSize()));
        g.setColor(getRandColor(110, 133));
                
        //绘制随机字符
        String randomString = "";
        for(int i=0;i<setString.length();i++){
        	randomString+=drowString(g,setString.substring(i, i+1),i);
        }            
        
       // System.out.println("指定的:"+randomString);
        g.dispose();
        
        return image;
    }
    
    /*
     * 绘制字符串
     */
    private String drowString(Graphics g,String drawString,int i){
        //g.setFont(getFont());
        g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
       
        g.translate(random.nextInt(3), random.nextInt(3));
        g.drawString(drawString, 25*i, 70);
        return drawString;
    }
    
    private String genetString(){
    	 String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
    	 return rand;
    }
    /*
     * 绘制干扰线
     */
    private void drowLine(Graphics g){
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        int xl = random.nextInt(13);
        int yl = random.nextInt(15);
        g.drawLine(x, y, x+xl, y+yl);
    }
    /*
     * 获取随机的字符
     */
    public String getRandomString(int num){
        return String.valueOf(randString.charAt(num));
    }
    
	public int getFontSize() {
		if(fontSize==0){
			return 32;
		}
		return fontSize;
	}
	public void setFontSize(int fontSize) {
		this.fontSize = fontSize;
	}
}
